package com.hp_dzzl.mixin.transmog;

import com.hidoni.transmog.TransmogUtils;
import com.hidoni.transmog.RenderUtils;
import com.hidoni.transmog.config.Config;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.world.item.ItemStack;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.Shadow;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;

/**
 * 这个Mixin用于修改TransmogUtils类的getAppearanceStackOrOriginal方法，
 * 实现只在世界中显示幻化外观，而在物品栏中保持原样的功能
 */
@Mixin(
        value = TransmogUtils.class,
        remap = false
)
public abstract class MixinGetAppearanceStackOrOriginal {
    // 影子方法，获取原版类中的notInPvP私有字段
    @Shadow(remap = false)
    private static boolean notInPvP;


    /**
     * 注入到原版方法头部，修改物品外观获取逻辑
     * @param itemStack 要处理的物品堆栈
     * @param cir 回调信息，用于修改返回值
     */
    @Inject(method = "getAppearanceStackOrOriginal",
            at = @At("HEAD"),
            cancellable = true,
            remap = false)
    private static void onGetAppearanceStackOrOriginal(
            ItemStack itemStack,
            CallbackInfoReturnable<ItemStack> cir) {

        // 跳过空物品
        if (itemStack.isEmpty()) {
            return;
        }

        // 检查物品是否有我们的特殊标签
        CompoundTag tag = itemStack.getTag();
        if (tag != null && tag.contains("world_only_render")) {
            // 如果在物品栏中渲染且配置允许，则返回原始物品
            if (Config.renderOption.renderInInventory && RenderUtils.isCalledForInventory()) {
                cir.setReturnValue(itemStack);
                return;
            }

            // 检查是否满足在世界中渲染的条件
            if (shouldRenderInWorld(itemStack)) {
                handleWorldRendering(itemStack, cir);
            }
        }
    }

    /**
     * 判断是否应该在世界中渲染幻化外观
     * @param itemStack 要检查的物品
     * @return 是否应该在世界中渲染幻化外观
     */
    private static boolean shouldRenderInWorld(ItemStack itemStack) {
        return notInPvP // 不在PvP状态
                && Config.renderOption.renderInWorld // 配置允许在世界中渲染
                && TransmogUtils.isItemStackTransmogged(itemStack); // 物品已经幻化
    }

    /**
     * 处理在世界中的渲染逻辑
     * @param itemStack 原始物品
     * @param cir 回调信息
     */
    private static void handleWorldRendering(
            ItemStack itemStack,
            CallbackInfoReturnable<ItemStack> cir) {

        // 获取外观物品
        ItemStack appearanceItemStack = TransmogUtils.getAppearanceItemStack(itemStack, true);

        // 如果是隐藏物品则返回原始物品
        if (TransmogUtils.isHiddenItem(appearanceItemStack)) {
            cir.setReturnValue(itemStack);
            return;
        }

        // 保持物品数量一致
        appearanceItemStack.setCount(itemStack.getCount());
        // 返回外观物品
        cir.setReturnValue(appearanceItemStack);
    }
}
